package bd;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class Application {

	Options options = new Options();
	CommandLine line;
	
	public Application() {
		
		DataBaseConection dataBaseConection = DataBaseConection.getInstance();
		
		while(true) {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			options.addOption("insertarDormitorio", false, "Inserta un dormitorio. Recibe su numero, estado, sexo admitido y cantidad de personas que entran en el cuarto.");
			options.addOption("insertarCarac", false, "Inserta una caracteristica/servicio que puede agregarse a un cuarto mediante insertarCaracADorm. Recbe el nombre y el precio.");
			options.addOption("insertarCaracADorm", false, "Inserta una caracteristica a un determinado dormitorio. Recibe la caracteristica y el dormitorio.");
			options.addOption("insertarReserva", false, "Inserta una reserva. Requiere numero de documento, tipo de documento, numero de cuarto, arribo y partida.");
			options.addOption("insertCliente", false, "Inserta un cliente. Requiere los datos del cliente.");
			
			options.addOption("historial", false, "Devuelve todas las reservas efectuadas en el Hostel");
			options.addOption("obtenerDormitorios", false, "Devuelve todos los dormitorios del Hostel");
			options.addOption("obtenerServicios", false, "Devuelve todos los Servicios del Hostel");
			options.addOption("serviciosDormitorio", false, "Devuelve todos los servicios de un dormitorio especifico");
			options.addOption("obtenerCuartosFiltro", false, "Devuelve los dormitorios del Hostel disponibles, que cumplan los filtros (cantidad de personas, sexo admitido, arrivo y partida).");
			options.addOption("existeCliente", false, "Devuelve los datos del cliente si existe en la base");
			options.addOption("cuartosConServicio", false, "Devuelve los cuartos que tengan el servicio especifico");
			options.addOption("caracteristicasCuarto", false, "Devuelve los caracteristicas del cuarto");
			options.addOption("eliminarDormitorio", false, "Pone fuera de uso al dormitorio deseado");
			options.addOption("eliminarServicio", false, "Elimina un servicio");
			options.addOption("disponibilidadDormitorios", false, "Lista los cuartos disponibles el las fechas estipuladas, avisando si tienen o no ba�o");


			
			options.addOption("promedioCuarto", false, "Nivel de ocupacion promedio de un cuarto especificado en un determinado periodo de tiempo");
			options.addOption("ocupacionHostal", false, "Nivel de ocupacion total del hostal en un determinado periodo de tiempo");
			options.addOption("cuartoMasSolicitado", false, "El cuarto mas solicitado en un determinado mes");
			options.addOption("cuartosSolicitados",false,"Listado de cuartos que tuvieron al menos un hu�sped en determinado per�odo de tiempo");
			options.addOption("huespedes",false,"Listado de todas las personas registradas en el sistema. Se debe poder ordenar por n�mero de documento, apellido o por fecha de nacimiento");
			options.addOption("reservasHuesped",false,"Listado de reservas hist�ricas de una persona en particular");
			options.addOption("fecha", false, "Muestra la fecha actual de la base de datos");
			options.addOption("menu", false, "Menu");
			options.addOption("salir", false, "Salir");
			CommandLineParser parser = new GnuParser();
			try {
				line = parser.parse(options, new String[] { br.readLine() });
				while (!line.hasOption("salir")) {
					if (line.hasOption("menu")) {
						printOptions();
					} else if (line.hasOption("promedioCuarto")) {
						System.out.println("Indique el numero de cuarto deseado: ");
						String cuarto=br.readLine();
						System.out.println("Indique el comienzo del periodo deseado[dd/mm/yyyy]: ");
						String comienzo = br.readLine();
						System.out.println("Indique el final del periodo deseado[dd/mm/yyyy]: ");
						String fin = br.readLine();
						System.out.println("Nivel de ocupacion promedio del cuarto "+cuarto+": " + Consultas.promedioCuarto(cuarto, comienzo, fin));
					} else if (line.hasOption("ocupacionHostal")) {
						System.out.println("Indique el comienzo del periodo deseado[dd/mm/yyyy]: ");
						String comienzo = br.readLine();
						System.out.println("Indique el final del periodo deseado[dd/mm/yyyy]: ");
						String fin = br.readLine();
						System.out.println("Nivel de ocupacion total del hostal entre " + comienzo + " y " + fin+": "+Consultas.ocupacionHostal(comienzo,fin));
					} else if (line.hasOption("cuartoMasSolicitado")) {
						System.out.println("Indique el mes deseado[mm]: ");
						String mes = br.readLine();
						System.out.println("Indique el ano deseado[yyyy]: ");
						String ano = br.readLine();
						System.out.println("Cuarto mas solicitado en el mes "+mes+" y ano "+ano+": "+Consultas.cuartoMasSolicitado(mes, ano));
					} else if (line.hasOption("cuartosSolicitados")) {
						System.out.println("Indique el comienzo del periodo deseado[dd/mm/yyyy]: ");
						String comienzo = br.readLine();
						System.out.println("Indique el final del periodo deseado[dd/mm/yyyy]: ");
						String fin = br.readLine();
						List<String> cuartos=Consultas.cuartosSolicitados(comienzo,fin);
						if(cuartos.size()==0)
							System.out.println("No existen cuartos que hayan tenido por lo menos un huesped entre "+comienzo+" y "+fin);
						else {
							System.out.println("Los cuartos que tuvieron aunque sea un huesped entre " + comienzo + " y " + fin+" son:");
							System.out.println("Numero de Dormitorio");
							for(String cuarto: cuartos)
								System.out.println(cuarto);
						}
					} else if (line.hasOption("huespedes")) {
						System.out.println("Indique la forma en la que desea a los huespedes ordenados, numero de [d]ocumento, [a]pellido, fecha de [n]acimiento: ");
						String forma = br.readLine();
						List<Cliente> huespedes=Consultas.huespedes(forma);
						if(huespedes == null){
							System.out.println("Opcion de ordenamiento incorrecta");
						}else{
							if(huespedes.size()==0)
								System.out.println("No existen huespedes que se hayan registrado en el Hostal");
							else {
								System.out.println("Huespedes:");
								System.out.println("NDocumento - TipoDoc - Nombre - Apellido - FechaNac - Sexo - Telefono - Email");
								for(Cliente huesped: huespedes)
									System.out.println(huesped);
							}
						}
					} else if (line.hasOption("reservasHuesped")) {
						System.out.println("Indique el tipo de documento del huesped el cual quiere ver sus reservas historicas: ");
						String tipo = br.readLine();
						System.out.println("Indique el numero de documento del huesped el cual quiere ver sus reservas historicas: ");
						String nro = br.readLine();
						List<Reserva> reservas=Consultas.reservasHuesped(tipo, nro);
						if(reservas.size()==0)
							System.out.println("No existen reservas del huesped");
						else {
							System.out.println("Reservas:");
							System.out.println("Numero - NDormitorio - Arribo - Partida - PrecioTotal");
							for(Reserva reserva: reservas)
								System.out.println(reserva);
						}
					} else if (line.hasOption("fecha")) {
						dataBaseConection.printDate();
					}else if(line.hasOption("insertarDormitorio")){
						System.out.println("Indique el numero del dormitorio a insertar: ");
						String nDorm=br.readLine();
						System.out.println("Indique la cantidad de personas que entran en el dormitorio: ");
						String cant = br.readLine();
						System.out.println("Indique el sexo admitido (M, F o A): ");
						String sex = br.readLine();
						System.out.println("Indique si el cuarto estara activo(AS) o no(AN): ");
						String active = br.readLine();
						if(Inserts.newDormitorio(nDorm, active, sex, cant)){
							System.out.println("Se ingreso el dormitorio "+nDorm);
						}else{
							System.out.println("Hubo un error al ingresar el dormitorio "+nDorm);
						}
					}else if(line.hasOption("insertarCarac")){
						System.out.println("Indique el nombre de la caracteristica: ");
						String carac=br.readLine();
						System.out.println("Indique el precio de la caracterisitica: ");
						String precio = br.readLine();
						if(Inserts.newCarac(carac, precio)){
							System.out.println("Se ingreso correctamente la caracterisica "+carac);
						}else{
							System.out.println("Hubo un error al ingresar la caracterisitica "+carac);
						}
					}else if(line.hasOption("insertarCaracADorm")){
						System.out.println("Indique el nombre de la caracteristica: ");
						String carac=br.readLine();
						System.out.println("Indique el numero del dormitorio: ");
						String nDorm = br.readLine();
						if(Inserts.newCaracDorm(carac, nDorm)){
							System.out.println("Se ingreso correctamente la caracterisica "+carac+" al dormitorio "+nDorm);
						}else{
							System.out.println("Hubo un error al ingresar la caracterisitica "+carac+" al dormitorio "+nDorm);
						}
					}else if(line.hasOption("obtenerDormitorios")){
						List<Dormitorio> dorms = Consultas.obtenerCuartos();
						
						if(dorms.size()!=0) {
							System.out.println("Numero de Dormitorio - Estado - Sexo Admitido - Cantidad");
							for(Dormitorio dor:dorms){
								System.out.println(dor);
							}
						}else
							System.out.println("No existen dormitorios");
							
					}else if(line.hasOption("disponibilidadDormitorios")){
						System.out.println("Indique el tipo de cuarto que desea ([f]emenino, [m]asculino, [a]mbos): ");
						String tipo=br.readLine();
						System.out.println("Indique el comienzo del periodo deseado[dd/mm/yyyy]: ");
						String comienzo = br.readLine();
						System.out.println("Indique el final del periodo deseado[dd/mm/yyyy]: ");
						String fin = br.readLine();
						
						List<String> dorms = Consultas.disponibilidadDormitorios(tipo, comienzo, fin);
						
						if(dorms.size()!=0) {
							System.out.println("Numero de Dormitorio - Cantidad Total - Cantidad Disponible - Ba�o Individual");
							for(String dor:dorms){
								System.out.println(dor);
							}
						}else
							System.out.println("No existen dormitorios");
							
					}else if(line.hasOption("obtenerServicios")){
						List<String> servicios = Consultas.obtenerServicios();
						
						if(servicios.size()!=0) {
							System.out.println("Servicio - Precio");
							for(String servicio: servicios){
								System.out.println(servicio);
							}
						} else {
							System.out.println("No ha servicios disponibles");
						}
							
					}else if(line.hasOption("serviciosDormitorio")){						
						System.out.println("Indique el numero del dormitorio: ");
						String cuarto=br.readLine();
						List<String> servicios=Consultas.obtenerServiciosDelCuarto(cuarto);
						for(String servicio: servicios){
							System.out.println(servicio);
						}
							
					}else if (line.hasOption("cuartosConServicio")) {
						System.out.println("Indique el servicio: ");
						String servicio=br.readLine();
						List<Dormitorio> dormitorios=Consultas.cuartosConServicio(servicio);
						if(dormitorios.size()!=0) {
							System.out.println("Numero de Dormitorio - Estado - Sexo Admitido - Cantidad");
							for(Dormitorio dormitorio: dormitorios){
								System.out.println(dormitorio);
							}
						}else
							System.out.println("No existen cuartos con ese servicio");
					}else if (line.hasOption("caracteristicasCuarto")) {
						System.out.println("Indique el numero de dormitorio: ");
						String nro=br.readLine();
						Dormitorio dormitorio=Consultas.caracteristicasCuarto(nro);
						if(dormitorio!=null) {
							System.out.println("Numero de Dormitorio - Estado - Sexo Admitido - Cantidad");
							System.out.println(dormitorio);
						}else
							System.out.println("No existe el dormitorio");
					}else if (line.hasOption("eliminarDormitorio")) {
						System.out.println("Indique el numero del dormitorio a eliminar: ");
						String nro=br.readLine();
						if(Inserts.eliminarDormitorio(nro))
							System.out.println("Dormitorio "+nro+" eliminado");
						else
							System.out.println("El dormitorio "+nro+" no se pudo eliminar");
					}else if (line.hasOption("eliminarServicio")) {
						System.out.println("Indique el nombre del servicio a eliminar: ");
						String servicio=br.readLine();
						if(Inserts.eliminarServicio(servicio))
							System.out.println("El servicio \""+servicio+"\" ha sido eliminado");
						else
							System.out.println("El servicio \""+servicio+"\" no se pudo eliminar");
					}else if (line.hasOption("actualizarServicio")) {
						System.out.println("Indique el nombre del servicio a actualizar: ");
						String servicio=br.readLine();
						System.out.println("Indique el nuevo precio del servicio: ");
						String nuevoPrecio=br.readLine();
						if(Inserts.actualizarServicio(servicio, nuevoPrecio))
							System.out.println("El servicio \""+servicio+"\" ha sido actualizado");
						else
							System.out.println("El servicio \""+servicio+"\" no se pudo actualizar");
					}else if(line.hasOption("insertarReserva")){						
						System.out.println("Indique el numero de documento de la persona: ");
						String nDoc=br.readLine();
						System.out.println("Indique el tipo de documento de la persona(DNI o PAS): ");
						String tipoDoc=br.readLine();
						System.out.println("Indique el numero de dormitorio: ");
						String nDorm=br.readLine();
						System.out.println("Indique la fecha de arrivo(DD/MM/AAAA): ");
						String arrivo=br.readLine();
						System.out.println("Indique la fecha de partida (DD/MM/AAAA): ");
						String partida=br.readLine();
						Inserts.newReserva(nDoc, tipoDoc, nDorm, arrivo, partida);
							
					}else if(line.hasOption("obtenerCuartosFiltro")){						
						System.out.println("Indique el tipo de dormitorio deseado (Masculino: M, Femenino: F, Ambos: A): ");
						String sexAdmit=br.readLine();
						System.out.println("Indique la capacidad del dormitorio (cantidad de personas): ");
						String cantPer=br.readLine();
						System.out.println("Indique la fecha de arrivo (DD/MM/AAAA): ");
						String arrivo=br.readLine();
						System.out.println("Indique la fecha de partida (DD/MM/AAAA): ");
						String partida=br.readLine();
						List<Integer> dorms = Consultas.obtenerCuartos(arrivo, partida, sexAdmit, cantPer);
						System.out.println("Cuartos Disponibles:");
						for(Integer dorm:dorms){
							System.out.println(dorm);
						}
					} else if (line.hasOption("existeCliente")) {
						System.out.println("Indique el tipo de documento: ");
						String tipo = br.readLine();
						System.out.println("Indique su numero de documento: ");
						String doc = br.readLine();
						Cliente cliente=Consultas.existeCliente(doc, tipo);
						if(cliente!=null) {
							System.out.println("NDocumento - TipoDoc - Nombre - Apellido - FechaNac - Sexo - Telefono - Email");
							System.out.println(cliente);
						}else
							System.out.println("No existe ese cliente");
					}else if (line.hasOption("insertCliente")) {
						System.out.println("Indique nombre: ");
						String nom = br.readLine();
						System.out.println("Indique el apellido: ");
						String apellido = br.readLine();
						System.out.println("Indique el tipo de documento (DNI o PAS): ");
						String tipo = br.readLine();
						System.out.println("Indique el numero de documento: ");
						String doc = br.readLine();
						System.out.println("Indique el sexo (F o M): ");
						String sexo = br.readLine();
						System.out.println("Indique el numero de telefono: ");
						String tel = br.readLine();
						System.out.println("Indique el email: ");
						String email = br.readLine();
						System.out.println("Indique la fecha de nacimiento (dd/mm/aaaa): ");
						String fechaNac = br.readLine();
						
						Inserts.newCliente(doc, tipo, nom, apellido, fechaNac, sexo, tel, email);
						
					}else if(line.hasOption("historial")){
						List<String> reservas = Consultas.historial();
						
						if(reservas.size()!=0) {
							System.out.println("Numero - NDocumento - TipoDoc - NDormitorio - Arribo - Partida - Precio Total");
							for(String res: reservas){
								System.out.println(res);
							}
						} else {
							System.out.println("No hay reservas");
						}
							
					}
					
					line = parser.parse(options, new String[] { br.readLine() });
				}
				System.exit(0);
			} catch (ParseException exp) {
				System.err.println("Error: " + exp.getMessage());
			} catch (IOException e) {
				e.printStackTrace();
			}
			catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	private void printOptions() {
		for (Object o : options.getOptions()) {
			Option option = (Option)o;
			System.out.println(option.getOpt() + " - " + option.getDescription());
		}
	}

	public static void main(String[] args) {
		new Application();
	}
}
